package org.inspiration.dudu.user.service;

import org.inspiration.dudu.common.pojo.Result;
import org.inspiration.dudu.user.model.dto.UserDTO;
import org.inspiration.dudu.user.model.dto.UserInfoDTO;
import org.inspiration.dudu.user.model.dto.UserLikeDTO;
import org.inspiration.dudu.user.model.entity.UserEntity;
import org.inspiration.dudu.user.model.entity.UserLikeEntity;
import org.inspiration.dudu.user.model.vo.UserVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 用户服务接口，提供用户相关的操作方法。
 */
public interface UserService {
    /**
     * 获取所有用户的信息。
     * 
     * @return 用户信息列表
     */
    List<UserVO> getAllUsers();

    /**
     * 根据用户ID查找用户信息。
     * 
     * @param id 用户ID
     * @return 用户信息
     */
    UserVO getUserById(Long id);

    /**
     * 用户登录。
     * 
     * @param userDTO 用户数据传输对象
     * @return 登录结果
     */
    String login(UserDTO userDTO);

    /**
     * 用户注册。
     * 
     * @param userDTO 用户数据传输对象
     */
    void register(UserDTO userDTO);

    /**
     * 根据token获取用户信息。
     * 
     * @param token 用户token
     * @return 用户信息
     */
    UserVO getUserByToken(String token);

    void decreaseUnreadCommentCount(Long repliedUserId);

    /**
     * 根据用户ID更新用户信息。
     * 
     * @param userInfoDTO 用户信息数据传输对象
     */
    void updateUserById(UserInfoDTO userInfoDTO);

    /**
     * 将用户实体转换为用户视图对象。
     * 
     * @param userEntity 用户实体
     * @return 用户视图对象
     */
    UserVO transToVO(UserEntity userEntity);

    /**
     * 将用户数据传输对象转换为用户实体。
     * 
     * @param userDTO 用户数据传输对象
     * @return 用户实体
     */
    UserEntity transToEntity(UserDTO userDTO);

    /**
     * 上传用户头像。
     * 
     * @param id 用户ID
     * @param file 用户头像文件
     */
    void uploadAvatar(Long id, MultipartFile file);

    /**
     * 增加用户的点赞数量。
     *
     */
    void increaseLikeCount(UserLikeEntity userLikeEntity);

    /**
     * 减少用户的点赞数量。
     *
     */
    void decreaseLikeCount(UserLikeEntity userLikeEntity);

    /**
     * 增加用户的关注者数量。
     * 
     * @param followingId 被关注者的用户ID
     */
    void increaseFollowerCount(Long followingId);

    /**
     * 增加用户的关注数量。
     * 
     * @param followerId 关注者的用户ID
     */
    void increaseFollowingCount(Long followerId);

    /**
     * 减少用户的关注者数量。
     * 
     * @param followingId 被关注者的用户ID
     */
    void decreaseFollowerCount(Long followingId);

    /**
     * 减少用户的关注数量。
     * 
     * @param followerId 关注者的用户ID
     */
    void decreaseFollowingCount(Long followerId);

    /**
     * 根据用户名获取用户ID。
     * 
     * @param username 用户名
     * @return 用户ID
     */
    Long getUserIdByUsername(String username);

    /**
     * 增加用户的文章数量。
     * 
     * @param userId 用户ID
     */
    void increaseArticleCount(Long userId);

    /**
     * 增加用户的问题数量。
     * 
     * @param userId 用户ID
     */
    void increaseQuestionCount(Long userId);

    /**
     * 增加用户的回答数量。
     * 
     * @param userId 用户ID
     */
    void increaseAnswerCount(Long userId);

    void increaseUnreadCommentCount(Long repliedUserId);

    void decreaseUnreadLikeCount(Long targetUserId);

    Boolean isOnline(Long id);

    List<UserVO> getOnlineUsers(Integer pageNum, Integer pageSize);

    Long onlineUserCount();
}
